#include "Dri_TIM6.h"

/**
 * @brief TIM6初始化
 * @param 每隔ms毫秒产生一次更新事件，单位为ms
 */
void Dri_TIM6_Init(uint16_t ms)
{
    // 1. 时钟使能 TIM6 ----------------------------------
    RCC->APB1ENR |= RCC_APB1ENR_TIM6EN;

    // 2. TIM6配置 --------------------------------------
    // 2.1 预分频器设置，实现100us计1个数
    TIM6->PSC = 7200 - 1;
    // 2.2 自动重装载值设置，实现计 10*ms 个数产生1个更新事件
    TIM6->ARR = 10 * ms - 1;
    // 2.3 更新中断使能
    TIM6->DIER |= TIM_DIER_UIE;

    // 3. NVIC配置 --------------------------------------
    NVIC_SetPriorityGrouping(3);        // 设置抢占优先级为4位
    NVIC_SetPriority(TIM6_IRQn, 1);     // 设置优先级为1
    NVIC_EnableIRQ(TIM6_IRQn);          // 使能TIM6中断
}

/**
 * @brief TIM6启动
 */
void Dri_TIM6_Start(void)
{
    // 启动定时器
    TIM6->CR1 |= TIM_CR1_CEN;
}

/**
 * @brief TIM6停止
 */
void Dri_TIM6_Stop(void)
{
    // 停止定时器(停止使能)
    TIM6->CR1 &= ~TIM_CR1_CEN;
}

/* ------------------------------------------------------------------------- */

// 定义弱函数，触发更新事件的时候被调用
__weak void Dri_TIM6_UpdateCallback(void)
{}

// 定义 TIM6 的中断服务函数
void TIM6_IRQHandler(void)
{
    // 清除更新事件标志位
    TIM6->SR &= ~TIM_SR_UIF;

    // 调用更新事件回调函数
    Dri_TIM6_UpdateCallback();
}
